package com.cetc.lambda;

import org.junit.Test;

import java.io.PrintStream;
import java.util.Comparator;
import java.util.function.BiPredicate;
import java.util.function.Consumer;
import java.util.function.Supplier;

/**
 * @Classname LambdaTest03
 * @Description 方法引用的测试
 * @Date 2022/12/23 21:10
 * @Created by louzhuangxi
 */
public class LambdaTest03 {
    /**
     * 使用的前提条件: 当要传递给lambda体的操作已经有函数实现了，就可以使用方法引用
     * 使用方法
     * 1. 对象 :: 非静态方法
     * 2. 类 :: 静态方法
     * 3. 类 :: 非静态方法
     */

    /**
     * 1.对象 :: 非静态方法
     */
    @Test
    public void test01() {
        Consumer<String> con1 = s -> System.out.println(s);
        con1.accept("北京");

        System.out.println("**************");

        PrintStream out = System.out;
        Consumer<String> con2 = out::println;
        con2.accept("beijing");
    }

    /**
     * 对象 :: 非静态方法
     */
    @Test
    public void test02() {
        Person person = new Person();
        person.setName("张三");
        Supplier<String> supplier = person::getName;
        System.out.println(supplier.get());

        System.out.println("*************");

        Supplier<String> supplier1 = person::getName;
        System.out.println(supplier1.get());
    }

    /**
     * 类 :: 静态方法
     */
    @Test
    public void test03() {
        Comparator<Integer> com1 = new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return o1.compareTo(o2);
            }
        };

        int compare = com1.compare(3, 2);
        System.out.println(compare);

        System.out.println("*********************************");

        Comparator<Integer> com2 = Integer::compare;
        int compare1 = com2.compare(1, 3);
        System.out.println(compare1);
    }

    /**
     * 类::非静态方法
     * 当函数式接口方法的第一个参数是需要引用方法的调用者，并且第二个参数是需要引用方法的参数(或无参数)时：ClassName::methodName
     */
    @Test
    public void test04() {
        BiPredicate<String, String> biPredicate = new BiPredicate<String, String>() {
            @Override
            public boolean test(String s1, String s2) {
                return s1.equals(s2);
            }
        };

        boolean flag1 = biPredicate.test("aa", "aa");
        System.out.println(flag1);

        System.out.println("**************************************************");

        BiPredicate<String, String> biPredicate1 = (s1, s2) -> s1.equals(s2);
        boolean flag2 = biPredicate1.test("aa", "bb");
        System.out.println(flag2);

        System.out.println("**************************************************");

        BiPredicate<String, String> biPredicate3 = String::equals;
        boolean flag3 = biPredicate3.test("11", "22");
        System.out.println(flag3);
    }


}
